package com.lecture.java8.date;

import java.time.Duration;
import java.time.Instant;
import java.time.Period;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.time.temporal.TemporalAmount;
import java.util.Calendar;
import java.util.Date;

/**
 * @author luyn
 * @description
 * @Date 2020/9/25 11:13
 * @Version 1.0
 */
public class DateUtil {

    public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
    public static final String PATTERN_DATE = "yyyy-MM-dd";
    public static final String PATTERN_TIME = "HH:mm:ss";

    //老date格式化
    private static final ConcurrentDateFormat DATETIME_FORMAT = ConcurrentDateFormat.of(PATTERN_DATETIME);
    private static final ConcurrentDateFormat DATE_FORMAT = ConcurrentDateFormat.of(PATTERN_DATE);
    private static final ConcurrentDateFormat TIME_FORMAT = ConcurrentDateFormat.of(PATTERN_TIME);

    //java8时间格式化
    public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(PATTERN_DATETIME);

    /***
     * @description 获取当前日期
     * @return 当前日期
    **/
    public static Date now() {
        return new Date();
    }

    /***
     * @description 添加年
     * @author luyn
     * @date 2020/12/15 15:06
     * @param date 时间
     * @param yearsToAdd 要添加的年数
     * @return java.util.Date 设置后的年数
    **/
    public static Date plusYears(Date date, int yearsToAdd) {
        return DateUtil.set(date, Calendar.YEAR, yearsToAdd);
    }

    /***
     * @description 增加月
     * @author luyn
     * @date 2020/12/15 15:09
     * @param date 时间
     * @param monthsToAdd 增加的月数
     * @return java.util.Date 修改后的时间
    **/
    public static Date plusMonths(Date date, int monthsToAdd) {
        return DateUtil.set(date, Calendar.MONTH, monthsToAdd);
    }

    /***
     * @description 添加周
     * @author luyn
     * @date 2020/12/15 15:13
     * @param date 时间
     * @param weeksToAdd 添加的周数
     * @return java.util.Date 需改后的时间
    **/
    public static Date plusWeeks(Date date, int weeksToAdd) {
        return DateUtil.plus(date, Period.ofWeeks(weeksToAdd));
    }

    /***
     * @description 增加天数
     * @author luyn
     * @date 2020/12/15 15:16
     * @param date 时间
     * @param daysToAdd 增加的天数
     * @return java.util.Date 修改后的时间
    **/
    public static Date plusDays(Date date, long daysToAdd) {
        return DateUtil.plus(date, Duration.ofDays(daysToAdd));
    }

    /***
     * @description 增加小时
     * @author luyn
     * @date 2020/12/15 15:21
     * @param date 时间
     * @param hoursToAdd 增加的小时数
     * @return java.util.Date 修改后的时间
    **/
    public static Date plusHours(Date date, long hoursToAdd) {
        return DateUtil.plus(date, Duration.ofHours(hoursToAdd));
    }

    /***
     * @description 增加分钟
     * @author luyn
     * @date 2020/12/15 15:25
     * @param date 时间
     * @param minutesToAdd 增加的分钟数
     * @return java.util.Date 修改后的时间
    **/
    public static Date plusMinutes(Date date, long minutesToAdd) {
        return DateUtil.plus(date, Duration.ofMinutes(minutesToAdd));
    }

    /***
     * @description 增加秒
     * @author luyn
     * @date 2020/12/15 15:27
     * @param date 时间
     * @param secondsToAdd 增加秒数
     * @return java.util.Date
    **/
    public static Date plusSeconds(Date date, long secondsToAdd) {
        return DateUtil.plus(date, Duration.ofSeconds(secondsToAdd));
    }

    /***
     * @description 增加毫秒
     * @author luyn
     * @date 2020/12/15 15:34
     * @param date 时间
     * @param millisToAdd 增加的毫秒数
     * @return java.util.Date 修改后的时间
    **/
    public static Date plusMillis(Date date,long millisToAdd) {
        return DateUtil.plus(date, Duration.ofMillis(millisToAdd));
    }

    /***
     * @description 日期增加时间量
     * @author luyn
     * @date 2020/12/15 15:37
     * @param date 时间
     * @param amount 时间量
     * @return java.util.Date
    **/
    public static Date plus(Date date, TemporalAmount amount) {
        Instant instant = date.toInstant();
        return Date.from(instant.plus(amount));
    }

    /***
     * @description 减少年
     * @author luyn
     * @date 2020/12/15 15:39
     * @param date 时间
     * @param years 减少的年数
     * @return java.util.Date
    **/
    public static Date minusYears(Date date, int years) {
        return DateUtil.set(date, Calendar.YEAR, -years);
    }

    /***
     * @description 减少月
     * @author luyn
     * @date 2020/12/15 15:45
     * @param date 时间
     * @param months 减少的月数
     * @return java.util.Date
    **/
    public static Date minusMonths(Date date, int months) {
        return DateUtil.set(date, Calendar.MONTH, -months);
    }

    /***
     * @description 减少周
     * @author luyn
     * @date 2020/12/16 9:39
     * @param date 时间
     * @param weeks 减少的周数
     * @return java.util.Date
    **/
    public static Date minusWeeks(Date date, int weeks) {
        return DateUtil.minus(date, Period.ofWeeks(weeks));
    }

    /***
     * @description 减少天数
     * @author luyn
     * @date 2020/12/16 9:42
     * @param date 时间
     * @param days 减少的天数
     * @return java.util.Date
    **/
    public static Date minusDays(Date date, long days) {
        return DateUtil.minus(date, Duration.ofDays(days));
    }

    /***
     * @description 减少小时
     * @author luyn
     * @date 2020/12/16 9:44
     * @param date 时间
     * @param hours 减少的小时数
     * @return java.util.Date
    **/
    public static Date minusHours(Date date, long hours) {
        return DateUtil.minus(date, Duration.ofHours(hours));
    }

    /***
     * @description  减少分钟
     * @author luyn
     * @date 2020/12/19 9:25
     * @param date 时间
     * @param minutes 减少的分钟数
     * @return java.util.Date
    **/
    public static Date minusMinutes(Date  date, long minutes) {
        return DateUtil.minus(date,Duration.ofMinutes(minutes));
    }

    /***
     * @description 减少秒
     * @author luyn
     * @date 2020/12/19 9:26
     * @param date 时间
     * @param seconds 减少的秒
     * @return java.util.Date
    **/
    public static Date minusSeconds(Date date,long seconds) {
        return DateUtil.minus(date,  Duration.ofSeconds(seconds));
    }

    /***
     * @description 减少毫秒
     * @author luyn
     * @date 2020/12/19 9:28
     * @param date 时间
     * @param millis 毫秒
     * @return java.util.Date
    **/
    public static Date minusMillis(Date date,long millis) {
        return DateUtil.minus(date, Duration.ofMinutes(millis));
    }

    /***
     * @description 日期减少时间
     * @author luyn
     * @date 2020/12/19 9:30
     * @param date  时间
       * @param amount  减少量
     * @return java.util.Date
    **/
    public static Date minus(Date date, TemporalAmount amount) {
        Instant instant = date.toInstant();
        return Date.from(instant.minus(amount));
    }


    /***
     * @description 设置日期属性
     * @author luyn
     * @date 2020/12/15 15:01
     * @param date 时间
     * @param calendarField 更改时间的属性
     * @param amount 更改数，-1表示减少
     * @return java.util.Date 设置后的时间
    **/
    private static Date set(Date date, int calendarField, int amount) {
        Calendar c = Calendar.getInstance();
        c.setLenient(false);
        c.setTime(date);
        c.add(calendarField, amount);
        return c.getTime();
    }

    /***
     * @description 日期格式化 yyyy-MM-dd HH:mm:ss
     * @author luyn
     * @date 2020/12/19 9:33
     * @param date 日期
     * @return java.lang.String
    **/
    public static String  formatDateTime(Date date) {
        return DATETIME_FORMAT.format(date);
    }

    /***
     * @description yyyy-MM-dd
     * @author luyn
     * @date 2020/12/19 9:38
     * @param date 时间
     * @return java.lang.String
    **/
    public static String formatDate(Date date) {
        return DATE_FORMAT.format(date);
    }

    /***
     * @description HH:mm:ss
     * @author luyn
     * @date 2020/12/19 9:40
     * @param date 时间
     * @return java.lang.String
    **/
    public static String formatTime(Date date) {
        return TIME_FORMAT.format(date);
    }

    /***
     * @description 设置指定格式的日期
     * @author luyn
     * @date 2020/12/19 9:42
     * @param date 日期
     * @param pattern 格式
     * @return java.lang.String
    **/
    public static String format(Date date, String pattern) {
        return ConcurrentDateFormat.of(pattern).format(date);
    }

    /***
     * @description java8日期格式化
     * @author luyn
     * @date 2020/12/19 9:49
     * @param temporal 日期
     * @return java.lang.String
    **/
    public static String formatDateTime(TemporalAccessor temporal) {
        return DATETIME_FORMATTER.format(temporal);
    }

    public static void main(String[] args) {
int _1123 = 2;
    }
}
